package com.uva.dbcs.gestionDeVehiculos.despliegue.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import com.uva.dbcs.gestionDeVehiculos.despliegue.GestorDeVehiculosLocal;
import com.uva.dbcs.gestionDeVehiculos.dominio.Carnet;
import com.uva.dbcs.gestionDeVehiculos.dominio.Fabricante;
import com.uva.dbcs.gestionDeVehiculos.dominio.Modelo;
import com.uva.dbcs.gestionDeVehiculos.dominio.Vehiculo;
import com.uva.dbcs.gestionDeVehiculos.persistencia.CarnetDAO;
import com.uva.dbcs.gestionDeVehiculos.persistencia.FabricanteDAO;
import com.uva.dbcs.gestionDeVehiculos.persistencia.ModeloDAO;
import com.uva.dbcs.gestionDeVehiculos.persistencia.VehiculoDAO;
import com.uva.dbcs.utilidades.dominio.TipoCarnet;

/**
 * Session Bean implementation class GestorDeVehiculos
 */
@Stateless
public class GestorDeVehiculos implements GestorDeVehiculosLocal {

	@EJB
	private VehiculoDAO vehiculoDAO;

	@EJB
	private ModeloDAO modeloDAO;

	@EJB
	private FabricanteDAO fabricanteDAO;
	
	@EJB
	private CarnetDAO carnetDAO;

	public GestorDeVehiculos() {

	}

	@Override
	public List<Vehiculo> getVehiculos() {

		return vehiculoDAO.findAll();
	}

	@Override
	public List<Modelo> getModelos() {

		return modeloDAO.findAll();
	}

	@Override
	public List<Fabricante> getFabricantes() {

		return fabricanteDAO.findAll();
	}

	@Override
	public Vehiculo getVehiculoById(int id) {

		return vehiculoDAO.find(id);
	}

	@Override
	public Fabricante getFabricanteById(int id) {
		return fabricanteDAO.find(id);
	}

	@Override
	public void crearNuevoVehiculo(boolean averiado, String color,
			double costeAdquisicion, Date fechaAdquisicion, double kilometraje,
			String matricula, String rutaImagen, int idmodelo) {
		
		Modelo m = modeloDAO.find(idmodelo);
		Vehiculo v = null;
		
		v = new Vehiculo(averiado, color, costeAdquisicion, fechaAdquisicion, kilometraje, matricula, rutaImagen, m);
		
		vehiculoDAO.create(v);
	}

	@Override
	public Modelo getModeloById(int id) {
		
		return modeloDAO.find(id);
	}

	@Override
	public List<Carnet> getCarnets() {
		
		return carnetDAO.findAll();
		
	}

	@Override
	public void crearNuevoModelo(double ancho, int año, double costeAlquiler,
			boolean gps, double largo, String nombre, double peso, int puertas,
			int idfabricante, TipoCarnet[] carnets) {
		
		// crear modelo
		
		Fabricante f = fabricanteDAO.find(idfabricante);
		Modelo m = new Modelo(ancho, año, costeAlquiler, gps, largo, nombre, peso, puertas, f);
		
		// crear carnets-modelo
		// los carnets se agregan al modelo al hacer el set
		List<Carnet> lca = null;
		for (TipoCarnet e: carnets){
			
			lca = new ArrayList<Carnet>();
			Carnet c = new Carnet(e, m);
			
			lca.add(c);
		}
		
		m.setCarnets(lca);
		
		modeloDAO.create(m);

		
	}

	@Override
	public Fabricante refreshFabricante(Fabricante f) {
		
		Fabricante f_nuevo = fabricanteDAO.find(f.getIdfabricante());
		fabricanteDAO.refresh(f_nuevo);
		
		return f_nuevo;
		
	}

	@Override
	public List<Vehiculo> getVehiculos(int costeMaximo, int costeMinimo,
			boolean gps, int idFabricante,
			int puertas) {
		
		// obtener el fabricante
		
		Fabricante fabricante = fabricanteDAO.find(idFabricante);
		
		return vehiculoDAO.find(costeMaximo, costeMinimo,
				gps, fabricante,
				puertas);
	}
}
